package cn.edu.zafu.bigdata.fui;

import java.io.*;
import java.util.HashMap;
import java.util.stream.Collectors;

import static java.lang.System.exit;

class Student implements Serializable {
    private String name;
    private String id;
    private String phone;

    Student( String id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

    @Override
    public String toString(){
        return ( " id: " + id + "  name: " + name + "  phone: " + phone);
    }
}

public class TestStuSys {
    HashMap<String, Student> map = new HashMap<>();

    private void stuAdd() throws IOException {
        String id, name, phone;
        System.out.println("请输入学生id、姓名、电话(用空格分隔)");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            try {
                String[] info = in.readLine().split(" ");
                id = info[0];
                name = info[1];
                phone = info.length == 3 ? info[2] : null;
                if(map.containsKey(id)) {
                    System.out.println("学号id重复，请重新输入");
                }
                else {
                    map.put(id, new Student(id, name, phone));
                    System.out.println("学生信息添加成功");
                    break;
                }
            } catch(IOException e){
                System.out.println(e.getMessage() );
            }
        }
}
    private void stuFind() throws IOException{
        System.out.println("请输入学生id进行查询(输入QUIT退出)");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            try {
                String id = in.readLine();
                if (id.equals("QUIT")) break;
                if (!map.containsKey(id)) {
                    System.out.println("未找到该学生");
                }
                else System.out.println(map.get(id).toString());
            } catch (IOException e){
                System.out.println(e.getMessage());
            }
        }
    }

    private void stuUpdate() throws IOException{
        String id, name, phone;

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            try {
                System.out.println("请输入学生id、姓名、电话(用空格分隔,输入QUIT退出)");
                String[] info = in.readLine().split(" ");
                if (info[0].equals("QUIT")) break;
                if (info.length < 3) {
                    System.out.println("请输入完整的学生信息");
                    continue;
                }
                id = info[0];
                name = info[1];
                phone = info.length == 3 ? info[2] : null;
                if(!map.containsKey(id)) {
                    System.out.println("未找到该学生，请重新输入");
                }
                else {
                    map.replace(id, new Student(id, name, phone));
                    System.out.println("学生信息更新成功");
                }
            } catch(IOException e){
                System.out.println(e.getMessage());
            }
        }
    }

    private void stuDel() throws IOException{
        String id;
        System.out.println("请输入学生id以删除学生信息(输入QUIT退出)");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            try {
                String info = in.readLine();
                if (info.equals("QUIT")) break;
                id = info;
                if(!map.containsKey(id)) {
                    System.out.println("未找到该学生，请重新输入");
                }
                else {
                    map.remove(id);
                    System.out.println("学生信息删除成功");
                    break;
                }
            } catch(IOException e){
                System.out.println(e.getMessage());
            }
        }
    }

    private void save() throws IOException{
        try (BufferedWriter file = new BufferedWriter(new FileWriter("src/main/java/cn/edu/zafu/bigdata/fui/files/stuInfo.txt"))){
            map.values().stream().map(Student::toString).forEachOrdered(f ->{
                try {
                    file.write(f);
                    file.newLine();
                } catch (IOException e){
                    System.out.println(e.getMessage() + "文件写入失败");
                }
            });
        } catch (IOException e){
            System.out.println(e.getMessage());
        }
    }

    public static void main(String[] args) throws IOException {

        try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in)) ){
            TestStuSys sys = new TestStuSys();
            while(true){
                System.out.println("""
                ======= 学生信息管理系统 =======
                1. 添加学生信息
                2. 检索学生信息
                3. 更新学生信息
                4. 删除学生信息
                5. 退出程序
                请输入操作编号 (1-5):""");
                String num = in.readLine();
                switch (num){
                    case "1": {
                        sys.stuAdd();
                        break;
                    }
                    case "2": {
                        sys.stuFind();
                        break;
                    }
                    case "3": {
                        sys.stuUpdate();
                        break;
                    }
                    case "4": {
                        sys.stuDel();
                        break;
                    }
                    case "5": {
                        sys.save();
                        System.out.println("已保存至文件styInfo.txt");
                        return;
                    }
                    default: {
                        System.out.println("请输入操作编号 (1-5):");
                        break;
                    }
                }

            }
        }
    }



}

/*1. (简答题)
综合性题目：学生信息管理系统

题目要求：



请编写一个基于 Java 的“学生信息管理系统”，该系统需支持以下功能：

1.用户界面

程序启动时，需显示以下菜单供用户选择：



======= 学生信息管理系统 =======
    1. 添加学生信息
    2. 检索学生信息
    3. 更新学生信息
    4. 删除学生信息
    5. 退出程序

    请输入操作编号 (1-5):
    根据用户输入的选项，进入相应的功能。

2.学生类设计：
    创建一个 Student 类，包含以下字段：
    id：学号（唯一标识符，类型为 String）
    name：姓名（类型为 String）
    phone：电话（类型为 String）
    需重写 toString() 方法，用于展示学生信息。
3.功能要求：
    3.1 添加学生信息：
        允许用户输入学号、姓名和电话，创建一个 Student 对象并保存到文件中。
        如果学号重复，则提示用户并要求重新输入。
    3.2 检索学生信息：
        允许用户通过学号检索学生信息，若找到则输出该学生的所有信息；否则提示“未找到该学生”。
        该功循环进行，直到用户输入"QUIT"后才退回到上一层的用户界面。
    3.3 更新学生信息：
        根据学号更新已有学生的信息（包括姓名和电话），若找不到对应的学生，则提示“未找到该学生”。
        该功循环进行，直到用户输入"QUIT"后才退回到上一层的用户界面。
    3.4 删除学生信息：
        根据学号删除学生信息，若找不到对应的学生，则提示“未找到该学生”。
        该功循环进行，直到用户输入"QUIT"后才退回到上一层的用户界面。
    3.5 退出程序：
        用户选择退出时，程序结束并保存所有修改。
4.文件操作要求：
    所有学生信息需序列化到文件中，并在每次操作时自动加载和保存。
    使用 对象流（ObjectInputStream 和 ObjectOutputStream） 实现学生信息的保存和读取。*/
